package com.dongdongshop_util;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

/**
 * 发邮件工具类
 */
public final class JavaMailUtil {

    /* 网易 */
    private static final String NETESAY_USER = "fan19991222@163.com"; // 网易发件人称号，同邮箱地址 需手动填写自己的
    private static final String NETESAY_PASSWORD = "19991222fan"; // 如果是qq邮箱可以使户端授权码，或者登录密码 需手动填写自己的

    /* 腾讯 */
    private static final String TENCENT_USER = "1755508350@qq.com"; // 腾讯发件人称号，同邮箱地址 需手动填写自己的
    private static final String TENCENT_PASSWORD = "kigesvwyxkgjfbhd"; // 如果是qq邮箱可以使户端授权码，或者登录密码 需手动填写自己的

    /**
     * @param recipient    收件人邮箱
     * @param title 标题
     * @param text  邮件正文
     */
    /* 发送验证信息的邮件 */
   public static boolean useTencent(String recipient,String title,String text) {
        try {
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.host", "smtp.qq.com");

            // 发件人的账号
            props.put("mail.user", TENCENT_USER);
            //发件人的密码
            props.put("mail.password", TENCENT_PASSWORD);

            //开启ssl加密（并不是所有的邮箱服务器都需要，但是qq邮箱服务器是必须的）
            MailSSLSocketFactory msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);

            // 构建授权信息，用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };

            // 使用环境属性和授权信息，创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);
            // 设置收件人
            InternetAddress toAddress = new InternetAddress(recipient);
            message.setRecipient(Message.RecipientType.TO, toAddress);

            // 设置邮件标题
            message.setSubject(title);

            // 设置邮件的内容体
            message.setContent(text, "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @param recipient       收件人邮箱
     * @param text     邮件正文
     * @param title    标题
     * @param pathName 文件路径
     */
    /* 发送验证信息的邮件(有附件) */
    public static boolean useNetEasy(String recipient, String title,String text, String pathName) {
        Transport transport = null;
        try {
            final Properties props = new Properties();
            //发送服务器需要身份验证
            props.put("mail.smtp.auth", "true");
            //发送邮件服务器的主机名
            props.put("mail.smtp.host", "smtp.163.com");
            // 发件人的账号
            props.put("mail.user", NETESAY_USER);
            //发件人的密码
            props.put("mail.password", NETESAY_PASSWORD);
            //开启ssl加密（并不是所有的邮箱服务器都需要，但是qq邮箱服务器是必须的）
            MailSSLSocketFactory msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);


            // 构建授权信息，用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息，创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);

            //抽象类MimeMessage为实现类  消息载体封装了邮件的所有消息
            Message message=new MimeMessage(mailSession);
            //设置邮件主题
            message.setSubject(title);
            //是一个容器它转载多个BodyPart对象（正文、附件或内嵌资源），它是一个抽象类，MimeMultipart为实现类
            Multipart multipart=new MimeMultipart();
            //BodyPart也是封装邮件消息的 ，但它是包含在Multipart中的
            BodyPart messagePart=new MimeBodyPart();
            //封装需要发送电子邮件的正文信息
            messagePart.setText(text);
            //把正文添加到multipart
            multipart.addBodyPart(messagePart);
            //重新实例化BodyPart（一个对象放正文、一个对象放附件）
            messagePart=new MimeBodyPart();
            //封装附件
            DataSource source=new FileDataSource(pathName);
            messagePart.setDataHandler(new DataHandler(source));
            messagePart.setFileName(pathName);
            //把附件放入到multipart
            multipart.addBodyPart(messagePart);
            //multipart放入到Message中
            message.setContent(multipart);
            //设置发件人地址
            message.setFrom(new InternetAddress(NETESAY_USER));
            //此类的功能是发送邮件 又会话获得实例
            transport=mailSession.getTransport();
            //开启连接
            transport.connect();
            //设置收件人地址邮件信息
            transport.sendMessage(message, new Address[]{new InternetAddress(recipient)});
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (transport != null) {
                    //邮件发送后关闭信息
                    transport.close();
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * @param recipient       收件人邮箱
     * @param text     邮件正文
     * @param title    标题
     */
    /* 发送验证信息的邮件(无附件) */
    public static boolean useNetEasy(String recipient,  String title,String text) {
        Transport transport = null;
        try {
            final Properties props = new Properties();
            //发送服务器需要身份验证
            props.put("mail.smtp.auth", "true");
            //发送邮件服务器的主机名
            props.put("mail.smtp.host", "smtp.163.com");
            // 发件人的账号
            props.put("mail.user", NETESAY_USER);
            //发件人的密码
            props.put("mail.password", NETESAY_PASSWORD);
            //开启ssl加密（并不是所有的邮箱服务器都需要，但是qq邮箱服务器是必须的）
            MailSSLSocketFactory msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);


            // 构建授权信息，用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息，创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);

            //抽象类MimeMessage为实现类  消息载体封装了邮件的所有消息
            Message message=new MimeMessage(mailSession);
            //设置邮件主题
            message.setSubject(title);
            //是一个容器它转载多个BodyPart对象（正文、附件或内嵌资源），它是一个抽象类，MimeMultipart为实现类
            Multipart multipart=new MimeMultipart();
            //BodyPart也是封装邮件消息的 ，但它是包含在Multipart中的
            BodyPart messagePart=new MimeBodyPart();
            //封装需要发送电子邮件的正文信息
            messagePart.setText(text);
            //把正文添加到multipart
            multipart.addBodyPart(messagePart);
            //重新实例化BodyPart（一个对象放正文、一个对象放附件）
            messagePart=new MimeBodyPart();
            //multipart放入到Message中
            message.setContent(multipart);
            //设置发件人地址
            message.setFrom(new InternetAddress(NETESAY_USER));
            //此类的功能是发送邮件 又会话获得实例
            transport=mailSession.getTransport();
            //开启连接
            transport.connect();
            //设置收件人地址邮件信息
            transport.sendMessage(message, new Address[]{new InternetAddress(recipient)});
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (transport != null) {
                    //邮件发送后关闭信息
                    transport.close();
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        return false;
    }



    public static void main(String[] args) throws Exception { // 做测试用
        JavaMailUtil.useNetEasy("aaaa@163.com", "最终测试版附件邮件test。", "附件邮件","D:\\3.jpg");
        System.out.println("发送成功");
    }


}
